package ia.robot.gui;

import ia.robot.app.Point;
import ia.robot.graphics.Bitmap;
import ia.robot.graphics.JCanvas;

import java.awt.BorderLayout;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.util.LinkedList;

import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.border.CompoundBorder;
import javax.swing.border.EmptyBorder;

/**
 * Clase que representa el panel encargado de la visualizacion de los tableros.
 * 
 * @author Jaime A. Corrales Gonzalez
 * @author Alejandro Tejera Perez
 */
public class MainCanvasPane extends JPanel {

	private static final long serialVersionUID = 1L;

	private JCanvas canvas;

	private JScrollPane scrollPane;

	/**
	 * Constructor dadas las dimensiones del tablero inicial.
	 * 
	 * @param width
	 *            - Anchura inicial del panel de dibujo (en tiles).
	 * @param height
	 *            - Altura inicial del panel de dibujo (en tiles).
	 */
	public MainCanvasPane(int width, int height) {
		super(new BorderLayout());

		canvas = new JCanvas(10, 10);

		JPanel centerPane = new JPanel();
		centerPane.setLayout(new BoxLayout(centerPane, BoxLayout.X_AXIS));
		centerPane.add(Box.createHorizontalGlue());
		centerPane.add(canvas);
		centerPane.add(Box.createHorizontalGlue());

		scrollPane = new JScrollPane(centerPane);
		scrollPane.setBorder(new CompoundBorder(new EmptyBorder(5, 5, 0, 0),
				scrollPane.getBorder()));

		this.add(scrollPane);
	}

	public void addMouseListener(MouseListener l) {
		canvas.addMouseListener(l);
	}

	public void addMouseMotionListener(MouseMotionListener l) {
		canvas.addMouseMotionListener(l);
	}

	public void setPath (LinkedList<Point> p) {
		canvas.setPath(p);
	}
	
	/**
	 * Metodo que dibuja el Bitmap producido por un tablero en el panel de
	 * dibujo.
	 * 
	 * @param source
	 *            - Bitmap producido por un tablero.
	 */
	public synchronized void blitBitmap(Bitmap source) {
		canvas.blitBitmap(source);
	}

	/**
	 * Metodo que redimensiona el panel de dibujo.
	 * 
	 * @param width
	 *            - Nueva anchura del panel de dibujo (en tiles).
	 * @param height
	 *            - Nueva altura del panel de dibujo (en tiles).
	 */
	public void resizeCanvas(int width, int height) {
		canvas.resizeCanvas(width, height);

		this.validate();
	}
}
